// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.io.Serializable;
// import java.util.ArrayList;
// import java.util.std::shared_ptr<std::list;
#pragma once
#include <list>
#include "../SQLStatementImpl.h"
#include "../SQLObjectImpl.h"
#include "../../../utils/Serializable.h"

class SQLASTVisitor;

class SQLCaseStatement_Item : public SQLObjectImpl, virtual public Serializable
{
public:
  static long serialVersionUID;
  SQLExpr_ptr conditionExpr;
  SQLStatement_ptr statement;

  SQLCaseStatement_Item();

  SQLCaseStatement_Item(SQLExpr_ptr conditionExpr, SQLStatement_ptr statement);
  SHAREDOBJECT(SQLCaseStatement_Item);

  SQLExpr_ptr getConditionExpr();

  void setConditionExpr(SQLExpr_ptr conditionExpr);

  SQLStatement_ptr getStatement();

  void setStatement(SQLStatement_ptr statement);

  void accept0(SQLASTVisitor_ptr visitor);

  //@Override
  int hashCode();

  //@Override
  bool equals(Object_ptr obj);
};

class SQLCaseStatement : public SQLStatementImpl, virtual public Serializable
{
public:
  SQLCaseStatement_Item_list_ptr items;
  SQLExpr_ptr valueExpr;
  SQLStatement_list_ptr elseStatements;

  SQLCaseStatement();
  SHAREDOBJECT(SQLCaseStatement);

  SQLExpr_ptr getValueExpr();

  void setValueExpr(SQLExpr_ptr valueExpr);

  SQLStatement_list_ptr getElseStatements();

  SQLCaseStatement_Item_list_ptr getItems();

  void addItem(SQLCaseStatement_Item_ptr item);

  void accept0(SQLASTVisitor_ptr visitor);

  //@Override
  SQLObject_list_ptr getChildren();

  //@Override
  bool equals(Object_ptr o);

  //@Override
  int hashCode();
};
